package com.boxman;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

// 基本游戏物体
class BaseGameObject {
    // 移动结果
    static class MoveResult {
        // 结果
        public enum Result {
            CANNOT_MOVE,        // 不具有移动能力
            NO_MOVE,            // 没有移动
            NORMAL_MOVED,       // 正常移动
            ARRIVED_ON_DEST,    // 移动到目标上
            LEFT_FROM_DEST      // 离开目标
        }
        
        public Result result = Result.CANNOT_MOVE;  // 移动结果
    }

    // 类型
    public enum Type {
        NOTHING,        // 什么也没有
        WALL,           // 墙
        BACKGROUND,     // 背景
        DESTINATION,    // 箱子的目的地
        BOX,            // 箱子
        MAN             // 小人
    }

    protected Graphics mDrawer;     // 绘图者
    protected BufferedImage mImage; // 图片
    protected Type mType;           // 类型
    protected int mX;               // 横向坐标
    protected int mY;               // 纵向坐标

    /**
     * 构造方法。
     * @param drawer    绘图者
     * @param type      类型
     * @param x, y      左上角坐标
     */
    public BaseGameObject(Graphics drawer, Type type, int x, int y) {
        // 初始化成员
        mDrawer = drawer;
        mType = type;
        mX = x;
        mY = y;

        // 加载图片
        final String imageFilePath = String.format(Const.IMAGE_FILE_PATH, type.ordinal());
        try {
            final File file = new File(imageFilePath);
            mImage = ImageIO.read(file);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
        
        // 绘制自身
        this.draw();
    }

    /**
     * 绘制自身。
     */
    public void draw() {
        mDrawer.drawImage(mImage, mX * Const.GRID_SIZE, mY * Const.GRID_SIZE, null);
    }

    /**
     * 获取类型。
     * @return 类型
     */
    public Type getType() {
        return mType;
    }
    
    /**
     * 移动。
     * @param direction     方向
     * @param moveResult    移动结果
     * @return 被推动的箱子
     */
    public BaseGameObject move(int direction, MoveResult moveResult) {
        moveResult.result = MoveResult.Result.CANNOT_MOVE;
        return null;
    }
}
